package com.example.juc.until;

import java.util.concurrent.RecursiveTask;

//1 forkJoinPool 通过他来计算
//2 计算任务forkJoinPool.execute(ForkJoinTask)
//3 计算类要继承ForkJoinTask
public class ForkJoinTest extends RecursiveTask<Long> {
    private  Long start;
    private Long end;

    private Long linjie=100_0000L;
    public ForkJoinTest(Long start, Long end) {
        this.start = start;
        this.end = end;
    }
    @Override
    protected Long compute() {
        if ((end-start)<linjie){
            long sum =0L;
            for (Long i = start; i <end ; i++) {
                sum+=i;
            }
            return sum;
        }else {
            long center =(start+end)/2; //中间值
            ForkJoinTest task1 =new ForkJoinTest(start,center);
            //task1.fork();直接这样使用会导致有一个线程变成boss线程。执行时间会变长。invokeAll使用这个
            task1.invoke(); //拆分任务 把任务压入线程队列
            ForkJoinTest task2 =new ForkJoinTest(center,end);
           // task2.fork(); //拆分任务 把任务压入线程队列
            //task1.fork();直接这样使用会导致有一个线程变成boss线程。执行时间会变长。invokeAll使用这个
            task2.invoke(); //拆分任务 把任务压入线程队列
            return task1.join()+task2.join();  //计算 完合并结果

        }
    }
}
